#include<iostream>
#include<string>
#include<vector>
#include<unistd.h>
#include<pthread.h>
#include<cstdio>
#include<cstring>

//snprintf介绍：
// id：目标字符数组（缓冲区），用于存储格式化后的字符串。
// 64：缓冲区的最大容量（包括终止符 \0）。
// "thread-%d"：格式化字符串，其中 %d 是整数占位符。
// i：要替换 %d 的整数值。
//功能：将整数 i 转换为字符串，并与 "thread-" 拼接，最终结果存储到 id 中

//static_cast<const char*>(args) 是一个类型转换操作
//static_cast是 C++ 中的一种类型转换运算符，它用于进行具有明确定义的类型转换


//创建多线程

const int num = 10;

void* routine(void* args)
{
	sleep(1);//在这里，它尝试将 args 的类型转换为 const char* 类型
	std::string name = static_cast<const char*>(args);
	delete (char*)args;

	int cnt = 5;
	while(cnt--)
	{
		std::cout << "new线程名字:" << name << std::endl;
	}
	return nullptr;
}

int main()
{	// char id[64];
	//这里不能这样写，这样指针指向没变，而指针内容随for变化（最终结果都一样了）
	std::vector<pthread_t> tids;//typedef unsigned long int pthread_t;
	for(int i = 0; i < num; i++)
	{
		pthread_t tid;
		// 应该这样动态开辟，每次都向一个新的数组里写入
		char* id = new char[64];
		snprintf(id, 64, "thread-%d", i);
		int n = pthread_create(&tid, nullptr, routine, id);
		if(n == 0)
			tids.push_back(tid);
		else
			continue;
	}

	for(int i = 0; i < num; i++)
	{
		// 一个一个的等待
		int n = pthread_join(tids[i], nullptr);
		if(n == 0)
		{
			std::cout << "等待新线程成功" << std::endl;
		}
	}
	return 0;
}
//1. main函数结束，代表主线程结束，一般也代表进程结束
//2. 新线程对应的入口函数，运行结束，代表当前线程运行结束
//3. 给线程传递的参数和返回值，可以是任意类型(包括对象)